多言語対応

概要

Next Design では表示言語を切り替えられます。その切り替えに連動してエクステンションの表示言語も切り替わるように、実装コードにロジックを追加することで、エクステンションを多言語対応にすることができます。

なお、エクステンションの多言語対応は任意です。多言語対応が不要な場合、以下の対応は必要ありません。

エクステンションを多言語対応するには、まず、表示言語ごとにリソース文字列を定義した ロケールファイル を作成します。 そして、それらのロケールファイルから表示箇所に対応するリソース文字列を取得するロジックを実装コードに追加・変更することで実現できます。 このように、多言語対応のために実装コードを追加・変更することを グローバライズ と呼びます。

ロケールファイルの作成

  • マニフェストが存在するフォルダに、次の名前でロケールファイルを追加することで、表示言語ごとにリソース文字列を定義できます。

    ファイル名の形式: locale.{lang}.json

    表示言語 lang ファイル名
    日本語 ja locale.ja.json
    English en locale.en.json
  • ロケールファイルの文字コードには UTF-8 を使用します。

ロケールファイルの実装例

locale.ja.json

{
    "locale": "ja",
    "resourceStrings" : {
        "MyExt.Tab.Label": "エクステンション",
        "MyExt.ValidationGroup.Label": "モデル検証",
        "MyExt.ValidationButton.Label": "検証",
        "MyExt.ValidationButton.Description": "全モデルを検証します。",
        "MyExt.Error.CanNotBeEmpty.Title": "空にできない",
        "MyExt.Error.CanNotBeEmpty.Message": "名前フィールドは空にできません",
        "MyExt.Error.CanNotChange.Message2": "{0}は{1}にできません"
    }
}

locale.en.json

{
    "locale": "en",
    "resourceStrings" : {
        "MyExt.Tab.Label": "Extension",
        "MyExt.ValidationGroup.Label": "Model Validation",
        "MyExt.ValidationButton.Label": "Validate",
        "MyExt.ValidationButton.Description": "Validate all models.",
        "MyExt.Error.CanNotBeEmpty.Title": "Can't be empty.",
        "MyExt.Error.CanNotBeEmpty.Message": "Name field can't be empty.",
        "MyExt.Error.CanNotChange.Message2": "Can't set {0} to {1}."
    }
}

マニフェスト内の文字列のグローバライズ

  • マニフェスト内で文字列を直接指定する代わりに、"%リソース文字列名%" のようにで指定することで、ロケールファイルで定義したリソース文字列に置き換えられます。
  • ロケールファイルに該当するリソース文字列名が存在しない場合は "%リソース文字列名%" がそのまま表示されます。

manifest.json

{
  "extensionPoints": {
    "ribbon": {
      "tabs": [
        {
          "id": "MyExtensions.Tab",
          "label": "%MyExt.Tab.Label%",
          "groups": [
            {
              "id": "MyExtensions.ValidationGroup",
              "label": "%MyExt.ValidationGroup.Label%",
              "controls": [
                {
                  "type": "Button",
                  "id": "MyExtensions.ValidationButton",
                  "label": "%MyExt.ValidationButton.Label%",
                  "description": "%MyExt.ValidationButton.Description%",
                  "imageLarge": "resources/icon.png",
                  "command": "Validate.Run"
                }
              ]
            }
          ]
        }
      ]
    }
  },
}

ハンドラ内の文字列のグローバライズ

次のようにロケールファイルからリソース文字列を取得します。

単純なリソース文字列

var title = context.GetResourceString("MyExt.Error.CanNotBeEmpty.Title");
var message = context.GetResourceString("MyExt.Error.CanNotBeEmpty.Message");
model.AddError("Name","Error",title,message);

パラメータ埋め込み型のリソース文字列

var title = context.GetResourceString("MyExt.Error.CanNotBeEmpty.Title");
var message = context.GetResourceString2("MyExt.Error.CanNotChange.Message2","aaa","bbb");
model.AddError("Name","Error",title,message);

リソース文字列取得のAPI

public interface IContext
{
    // 現在のカルチャのリソース文字列を取得する
    string GetResourceString(string key);
    string GetResourceString1(string key,string param1);
    string GetResourceString2(string key,string param1,string param2);
    string GetResourceString3(string key,string param1,string param2,string param3);
}